Korišćenje "Engine" objekta
Korišćenje "Engine" objekta
Već smo rekli da "Engine" objekat predstavlja motor izveštaja, koji upravlja konstrukcijom izveštaja. Proces raspoređivanja banda na stranici može se upravljati korišćenjem svojstava i metoda motora. Prvo malo teorije.
Donji dijagram prikazuje različite dimenzije stranice izveštaja.

Fizičke dimenzije stranice su svojstva "PaperWidth" i "PaperHeight", vidljiva u inspektoru objekata kada je stranica izabrana. Tako je veličina A4 stranice 210 x 297mm.
"PageWidth" i "PageHeight" su dimenzije štampane oblasti, koja je obično manja od fizičkih dimenzija stranice. Veličina štampane oblasti zavisi od svojstava stranice izveštaja "LeftMargin", "TopMargin", "RightMargin" i "BottomMargin". Veličina štampane oblasti u pikselima vraća se funkcijama "Engine.PageWidth" i "Engine.PageHeight".
Na kraju, "FreeSpace" je visina slobodnog prostora na stranici. Ako postoji "Page Footer" band na stranici, njegova visina se uzima u obzir prilikom izračunavanja "FreeSpace". Ova visina se vraća u pikselima funkcijom "Engine.FreeSpace". Imajte na umu da se nakon prikazivanja sledećeg banda slobodni prostor smanjuje na stranici, to se uzima u obzir prilikom izračunavanja "FreeSpace".
Kako se konstruiraju stranice izveštaja? FastReport jezgro prikazuje bande na stranici sve dok ima dovoljno slobodnog prostora. Kada više nema slobodnog prostora, "Page Footer" band se štampa (ako je potrebno) i kreira se nova prazna stranica. Kao što je već rečeno, nakon prikazivanja sledećeg banda visina slobodnog prostora se smanjuje. Štaviše, prikaz sledećeg banda počinje od trenutne pozicije, koja je definisana koordinatama na X-osi i Y-osi. Trenutna pozicija se vraća sa "Engine.CurX" i "Engine.CurY" respektivno. Nakon štampanja sledećeg banda, CurY se automatski povećava za visinu štampanog banda. Nakon što se kreira nova stranica, "CurY" je jednako "0." "CurX" se menja prilikom štampanja višekolonnih izveštaja.
"Engine.CurX" i "Engine.CurY" su dostupni ne samo za čitanje već i za pisanje. To znači da se bande mogu pomerati povećanjem ili smanjenjem ovih vrednosti. Na primer, u izveštaju koji liči na ovaj:

Može se štampati na sledeći način:

To se postiže pisanjem handler-a za događaj "OnBeforePrint" banda:
procedure MasterData1OnBeforePrint(Sender: TfrxComponent);
begin
Engine.CurX := Engine.CurX + 5;
end;
Promena "CurY" može izazvati preklapanje bandova, na primer:

Postignuto ovim skriptom:
procedure MasterData1OnBeforePrint(Sender: TfrxComponent);
begin
Engine.CurY := Engine.CurY - 15;
end;
Metoda "Engine.NewPage" umetne prekid stranice na bilo kojoj potrebnoj tački u izveštaju, nakon čega štampanje nastavlja od vrha nove izlazne stranice. U našem primeru prekid može biti umetnut nakon štampanja drugog zapisa:
procedure MasterData1OnAfterPrint(Sender: TfrxComponent);
begin
if <Line> = 2 then
Engine.NewPage;
end;
Imajte na umu da smo koristili događaj "OnAfterPrint" (to jest, nakon što je band štampan). Takođe imajte na umu da sistemska promenljiva "Line" vraća redni broj zapisa.
Metoda "Engine.NewColumn" umetne prekid kolone u višekolonim izveštajima. Ako više nema slobodnih kolona na stranici, tada se kreira nova stranica.
Faktura sa Uplatnicama
U sledećem primeru prikazana je štampana verzija naloga i faktura sa uplatnicama. Dostupni su samo za slovenačko i hrvatsko zakonodavstvo. Takvi izveštaji su '2U2 - Faktura - UPN - Obrazac' za slovenačko i '2U7 - Faktura - HUB 3A - Obrazac' za hrvatsko zakonodavstvo. Možete videti dizajn ovih izveštaja otvaranjem dizajnera izveštaja iz registra izveštaja.
Želimo da štampamo uplatnicu uvek tačno na dnu stranice. Da bismo primorali ovo ponašanje, postavljamo trenutnu vertikalnu poziciju (Engine.CurY) banda sažetka izveštaja tako da postoji tačno dovoljno prostora da se prikaže na ovoj stranici. To radimo sa sledećim kodom:
procedure UPNOnBeforePrint(Sender: TfrxComponent);
begin
...
Engine.CurY := Engine.CurY + Engine.FreeSpace - UPN.Height - 1;
end;
Kada se kreira izveštaj, uplatnica će preklapati postojeći tekst ako je previsoka. Tako da moramo ispraviti naš kod da štampamo uplatnicu na sledećoj stranici u ovom slučaju.
procedure UPNOnBeforePrint(Sender: TfrxComponent);
begin
...
if Engine.CurY > Engine.CurY + Engine.FreeSpace - UPN.Height - 1 then
Engine.NewPage;
Engine.CurY := Engine.CurY + Engine.FreeSpace - UPN.Height - 1;
end;